﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace C_初级教程
{
    internal class 静态类静态方法
    {

        //为什么要使用static 修饰符
        //static到底有什么作用呢？

        //static 静态的，用于将类或方法共享出来 （他只会在内存中存在一份，不会有更多的实例）
        //能不能把所有的方法都声明成公共的呢？都是static的？
        // 答： 不能。 static :从程序开始运行就开始分配内存，程序结束才释放内存。

        //非静态方法：没有使用static修饰的方法
        //生命周期：  对象开始调用方法的时候开始分配内存，调用的方法执行完毕后，有GC(.net 垃圾回收机制)在空闲时释放

        //内存区： 方法区，专门用来存放方法
        //静态区:  放一些公共的类或方法

        //静态成员变量和静态方法是属于 类 的
        //非静态成员变脸和方法是属于 对象 的


        /// <summary>
        /// 使用静态类
        /// </summary>
        /// <returns></returns>
        public int  useStatic()
        {
            MyCoculation.Num1 = 1;
            MyCoculation.Num2 = 5;
            return MyCoculation.Plus();
        }
    }


    /// <summary>
    /// 静态类 
    /// 所有的成员和方法必须都要声明成静态的
    /// </summary>
    public static class MyCoculation
    { 
        //  实例成员 == 非静态成员   (静态类中不允许有非静态成员)

        public static int Num1 { get; set; }

        public static int Num2 { get; set; }

        public static int Plus()
        { 
            return Num1 + Num2;
        }
    }

    /// <summary>
    /// 非静态类中的静态方法和静态变量
    /// </summary>
    public class Student
    { 
        //学校名称是可以共享的(可以声明成静态)(属于类)
        public static string SchoolName { get; set; }

        //非共享属性，不能声明成静态(属于对象)
        public string Name { set; get; }
        public int Money { set; get; }

        //实例成员方法(属于当前对象)
        public void Eat()
        { 
            //实例方法可以访问静态成员变量
            string schoolName = SchoolName;

            Study();//实例方法可以访问静态方法
        }


        //共享的方法(声明成静态)(属于类)
        /// <summary>
        /// 静态方法内部只能访问静态成员变量和静态方法
        /// </summary>
        public static void Study()
        {
            //静态方法不能访问非静态方法(静态成员方法属于类，非静态属于对象，两者不在同一层次,类的层次高于对象，公共的不能访问似有的，似有的可以访问公共的)
            Eat();
        }

    }

    /// <summary>
    /// 静态构造函数 与 实例构造函数
    /// </summary>
    public class Animal
    {
        public static string Name { set; get; }

        public int Age { get; set; }

        /// <summary>
        /// 实例构造函数 (是用来构造实例对象的)
        /// </summary>
        public Animal()
        {
            //是用来初始化实例成员变量的,也可以初始化静态属性
            Age = 1;
            Name = "余冰";
        }


        /// <summary>
        /// 静态构造函数
        /// 静态构造函数只能写一个，且不能有访问修饰符！！！
        /// 第一次访问这个类的时候会自动执行静态构造函数
        /// 由CLR来保证它只会执行一次(由此证明，静态成员只会在内存中加载一次)
        /// 先执行静态构造函数，再执行实例构造函数
        /// </summary>
        static Animal()
        {
            //是用来初始化静态成员变量的
            Name = "动物";
        }
    }
}
